'''
此模块用于处理日志，建立日志系统。
  
    使用方法：
      1.导入datatools包。
      2.导入logging包。
      3.logger = logging.getLogger()
      4.使用logger即可。
    另外，若想要改变日志路径，需要修改此包中的LOG_FILE_PATH值。
'''

import logging
import logging.config
import os
import os.path

LOG_FILE_PATH = os.path.join(".","logs","mylog.log")

log_dict = {
    'version':1,
    'disable_existing_loggers':False,
    
    #日志信息格式化输出配置
    'formatters':{
        
        #简单日志输出
        'simple':{
            'format':'%(levelname)s %(filename)s %(funcName)s %(lineno)d %(message)s'
        },
        
        #详细日志输出
        'verbose':{
            'format':'%(levelname)s %(asctime)s %(filename)s %(funcName)s %(lineno)d %(message)s'
        },
    },
    
    #日志信息处理器配置
    'handlers':{
        #向终端输出日志
        'console':{
            'level':'DEBUG',                   #处理日志等级，DEBUG及以上
            'class':'logging.StreamHandler',   #日志处理器
            'formatter':'simple'               #日志格式化配置
        },
        
        #向文件输出日志
        'file':{
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'formatter':'verbose',
            'filename':LOG_FILE_PATH,
            'maxBytes':1024*1024,
            'backupCount':20,
            'encoding':'utf8',
        },

        #运行时信息处理器
        'run_console':{
            'level':'WARNING',                 #处理日志等级，DEBUG及以上
            'class':'logging.StreamHandler',   #日志处理器
            'formatter':'simple'               #日志格式化配置
        },
        'run_file':{
            'level':'INFO',
            'class':'logging.handlers.RotatingFileHandler',
            'formatter':'verbose',
            'filename':LOG_FILE_PATH,
            'maxBytes':1024*1024,
            'backupCount':20,
            'encoding':'utf8',
        },
    },
    
    #默认根日志处理器
    'root':{
        'level':'DEBUG',
        'handlers':['console']
    },
    
    #自定义的日志处理器
    'loggers':{
        'mylog':{
            'level':'DEBUG',
            'handlers':['file'],
            'propagate':True
        }
    },
}

def setup_logging():
    dir_path = os.path.split(LOG_FILE_PATH)[0]
    if not os.path.exists(dir_path):
        os.mkdir(dir_path)
    logging.config.dictConfig(config=log_dict)

def set_log_mode(mode='dev'):
    '''设置日志模式，共有dev、debug、run三种模式。
    dev模式：只使用控制台输出日志信息；日志记录为DEBUG级别。
    debug模式：使用控制台和日志文件同时输出信息；日志记录为DEBUG级别。
    run模式：只使用日志文件的方式输出信息；日志记录为INFO级别。
    '''
    if mode == 'dev':
        log_dict['root']['level'] = 'DEBUG'
    elif mode == 'debug':
        log_dict['root']['handlers'] = ['console','file']
        log_dict['root']['level'] = 'DEBUG'
    else:
        log_dict['root']['handlers'] = ['run_console','run_file']
        log_dict['root']['level'] = 'INFO'
        log_dict['root']['propagate'] = True

    logging.config.dictConfig(config=log_dict)